perm filename IMPSER.DOC[SS,SYS] blob
sn#440720 filedate 1979-05-09 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00017 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00003 00002 IMPSER documentation MRC 5/9/79
C00005 00003 IMP interface I/O programming:
C00008 00004 IMP-Host Protocol:
C00013 00005 Host-Host Protocol:
C00017 00006 Host-Host Protocol opcode definitions (from NIC 8246 and NIC 30490):
C00021 00007 Host-Host Protocol error codes:
C00024 00008 IMP user mode programming:
C00027 00009 IMP I/O status word:
C00030 00010 IMP MTAPEs:
C00033 00011
C00035 00012 Host number specification:
C00038 00013 Socket assignments:
C00041 00014 User messages:
C00043 00015 NCP operation messages:
C00045 00016 IMP-Host Protocol messages:
C00048 00017 Host-host Protocol messages:
C00054 ENDMK
C⊗;
IMPSER documentation MRC 5/9/79
Before even trying to understand IMPSER, you should be familiar
with what's in BBN Report 1822, Specifications for the Interconnection
of a Host and an IMP; and NIC 7104, ARPAnet Protocol Handbook (at
least the Host-Host protocol). You should also read the UUO manual,
section 12.14, on user mode I/O programming for the IMP. This
document has brief summaries, but it is no substitute for the real
thing.
Now that you understand all of this completely, you're now ready
to read the rest of this document.
IMP interface I/O programming:
The IMP interface is device 400, mnemonic IMP.
I/O to the IMP is done via DATAI and DATAO. In 32. bit mode
the byte is returned left-adjusted in the word.
"stop" means enable "wait". "wait" happens after the last bit
has come in (if enabled by "stop") to allow the programmer to change
data modes before the first bit of the next word comes in.
CONI IMP,bits
Bit Name Meaning
2.9 TYHB There's Your Host Bit
2.8 RFNHB Ready For Next Host Bit
2.7 TEST Interface is in test mode
2.6 IMPERR IMP error (the READY line has gone down)
2.5 IDONE Input done
2.4 IEND Input end (end of message)
2.3 ODONE Output done
2.2 ¬READY IMP not ready if ¬TEST (actually ¬TEST∧¬READY)
1.9→1.7 IEPIA input end PI channel
1.6→1.4 IDPIA input done PI channel
1.3→1.1 ODPIA output done PI channel
CONO IMP,bits
Bit Name Meaning
2.7 TEST Enter test mode. In test mode the output side is
tied to the input side of the interface, and READY
is brought down
2.6 STRIN Start input, sets stop, clears IEND
2.5 I32 Set 32. bit input mode if IDPIEN set
2.4 O32 Set 32. bit output mode if ODPIEN set
2.3 CLRST Clear stop
2.2 CLRWT Clear wait
1.8 STROUT Start output
1.7 FINO Finish output (last bit has been sent)
1.6 IEPIEN Enable change of IEPIA
1.5 IDPIEN Enable change of input byte size and IDPIA, clear
IMPERR
1.4 ODPIEN Enable change of output byte size and ODPIA
1.3→1.1 PIA PI channel (see IEPIEN, IDPIEN, ODPIEN)
IMP-Host Protocol:
The protocol is in about 3 layers. The first layer is IMP-HOST
protocol. The IMP sends us each message prefaced by a 96-bit leader
which looks like this:
1 4 5 8 9 16 17 20 21 22 24 25 32
**********************************************************************
****** NEW * DESTINATION ******* * LEADER * MESSAGE *
****** FORMAT * NETWORK ******* TRACE * FLAGS * TYPE *
****** FLAG * ******* * * *
**********************************************************************
33 40 41 48 49 64
**********************************************************************
* HANDLING * DESTINATION * DESTINATION *
* TYPE * HOST * IMP *
* * * *
**********************************************************************
65 76 77 80 81 96
**********************************************************************
* * * *
* MESSAGE-ID * SUB-TYPE * MESSAGE LENGTH *
* * * *
**********************************************************************
Bits 1→4 and 17→20 are unassigned and must be zero. Bits 5→8 are
the new format flag and must be 15. This allows the receiver to
distingush between new-style and old-style leaders. Bit 21 is the
trace bit. We ignore messages with this bit. Bit 22 is a flag for us
which we ignore; bits 23 and 24 are unassigned. Bits 25→32 are the
message type. It tells us what to do with the message we got.
Regular messages are type 0. Types 1, 7, 8, 9, and 10 are errors of
various kinds. Type 2 is a warning that the IMP is going down, type 4
is no-op, type 6 is dead host status, and type 11→14 are for the
legendary non-blocking host interface. All other types are currently
unassigned.
Bit 33 is the priority message bit. We set it on INS and INR
messages we send. The other bits of the handling type are unused.
The host and IMP are obvious. The high order 8 bits of the message
id are the link number; the low order 4 bits must be zero. The link
number is used extensively in the host-host protocol. The sub-type
means various random things. We never set the message length and
we always ignore it.
Host-Host Protocol:
The second level protocol goes as follows. When a connection is
open, there is a unique host-link number associated with each
direction of communication. Messages go back and forth as regular
messages. Opening and closing connections is the hard part. All
"control" messages, that is messages regarding opening and closing and
regulating connections themselves, go on link zero. Most of these
commands have some identifying field that tells what connection they
are talking about. Opening and closing a connection (before the
unique link number is assigned) is done with the codes STR, RTS, and
CLS and carry along what are called socket numbers. These numbers are
32-bits long.
To establish a connection, you need a foreign socket number to
connect to. There is defined to be at each site a LOGGER, listening
to public sockets, which returns a socket number for you to connect
to. To open a connection, you send a STR or a RTS, depending on
whether you are sending or receiving. These operations carry a local
socket number and a foreign socket number and one additional byte,
which is a connection byte size if RTS and a link number if STR. A
connection is open when STR and RTS with matching socket numbers have
been exchanged. A connection is half-duplex. To get transmission
both ways, you need to open two connections. The usual way is to open
a connection on the socket number you get from the LOGGER and on that
number plus one.
A connection may be changed in at least two ways. The simplest is
the reset (RST). A host receiving a reset is supposed to break all
connections to the host sending the reset. The receiving host is to
return a reset REPLY (RRP) as well.
The graceful way to break a connection is to send a close (CLS)
with the pair of socket numbers. The host receiving the CLS is to
return a CLS with the same socket numbers in it and cause the
connection to be broken. The connection is not broken until CLSs have
been exchanged.
When a connection is open, the receiver sends the sender an
allocate message (ALL) telling the sender how much buffering he has
available. Every time the sender sends a message, he decrements this
number. Each time the sender receives an allocate operation, he adds
the new allocation into the current allocation.
Host-Host Protocol opcode definitions (from NIC 8246 and NIC 30490):
NOP 0 No-Operation.
RTS 1 Establish connection, sent from Receiver To Sender.
Followed by 32 bit receive socket, 32 bit send
socket, and 8 bit of link number.
STR 2 Establish connection, sent from Sender To Receiver.
Followed by 32 bit of send socket, 32 bit receive
socket, and 8 bit byte size.
CLS 3 Close connection. Followed by 32 bit local socket
number and 32 bit foreign socket number.
ALL 4 Allocate, sent from receiver to sender telling how
much data may be sent at a time. Followed by
8 bit link number, 16 bit message allocation and
32 bit bit allocation.
GVB 5 Give Back allocation, sent from receiver to sender
to request return of storage. Followed by 8 bit
link number, 8 bit 7-fixed-binary-place fraction
which is the fraction of the message space to be
returned, and 8 bit fraction which is the fraction
of the bit space to be returned.
RET 6 Return storage, sent from sender to receiver either
spontaneously or in response to a GVB command.
Followed by 8 bit link, 16 bit message space, and 32
bit bit space.
INR 7 Interrupt by Receiver, asks the sender to cease.
Followed by 8 bits of link number.
INS 10 Interrupt by Sender, tells receiver to interrupt
receiving process. A special character is included
in the text stream to mark where in time the interrupt
is to occur. Followed by 8 bit link number.
ECO 11 Echo test. Followed by 8 bit test data. Receiving
host is to return said data verbatum via following
command:
ERP 12 Echo Reply. Followed by 8 bit returned test data.
ERR 13 Error. Followed by 8 bit error code and 80 bit
error data.
RST 14 Reset. Asks host to clear all tables and connections
having to do with us.
RRP 15 Reset Reply. Indicates the reset has been done.
RAR 16 Reset Allocation by Receiver. Indicates the RAS has
been done.
RAS 17 Reset Allocation by Sender. Tells the receiver to
clear allocations.
RAP 20 Reset Allocation Please. Sent from receiver to sender
to ask it to send an RAS.
NXR 21 Non-existent Receive link. Tells sender the link it
used is non-existant (eg, data message).
NXS 22 Non-existent Send link. Tells receiver the link it
used is non-existant (eg, ALL).
Host-Host Protocol error codes:
ILO 1 Illegal Opcode. An illegal opcode was detected in
a control message. The "data" field contains the
ten bytes of the ailing control message beginning
with the byte containing the illegal opcode.
SPS 2 Short Parameter Space. The end of a control message
was encountered before all the required parameters of
the control command being decoded were found. The "data"
field contains the command in error.
BDP 3 Bad Parameters. Erroneous parameters were found
in a control command. Data field contains ailing command.
NES 4 Non-Ex Socket. A command other than STR or RTS was
received for a connection for which no request for
connection has been made.
NOS 5 Non-Open Socket. A command other than STR or RTS was
received for a connection which is not completely open.
LNC 6 Link Not Connected. Control command containing
a link number for which no connection exists.
IHH 7 Invalid Host Header. Non-zero M1/M2, invalid byte size,
undersized control message, etc.
When the error code is zero, the next 8 bit byte is the Stanford
peculiar error code, followed by 72 bits of the ailing command
returned. Here are the Stanford error codes.
CTO 1 Counter Overflow. Either message space exceeded
or bit space exceeded by the last message. The
message was discarded.
IBS 2 Illegal Byte size for control message. Message
was discarded.
IGN 3 Illegal Gender (Anita Bryant feature--sockets must
be heterosocketual, ie. odd to even and even to odd)
IER 4 Illegal Error. Host sent us an ERR for no good reason.
IMP user mode programming:
The IMP controlling UUOs are MTAPE UUOs. The address of the
MTAPE points to a block. The first word of the block is the function
code that determines what to do and how to interpret any other words
in the block. The second word is often a status bits word for the
connection.
Status bits are in the form:
1.1 → 1.6 MTAPE error code:
1 → socket in use
2 → can't change socket
3 → IMPSER bug; RTS&STR but no DDB
4 → no links available; LNKTAB is full
5 → illegal byte size
6 → NCP dead
7 → gender mismatch (more of the Anita Bryant feature)
1.7 → 2.9 When dead host expected back up, in GMT:
7776 means unknown, 7777 means over a week from now. Otherwise:
1.7 → 2.1 minutes/5
2.2 → 2.6 hours
2.7 → 2.9 day of week (Monday = 0, etc.)
3.1 → 3.4 Why host is down
0 → unknown
1 → host took ready down without saying why
2 → host is tardy
3 → host doesn't exist
4 → NCP initialization
5 → scheduled PM
6 → scheduled hardware work
7 → scheduled software work
10 → emergency restart
11 → power outage
12 → software breakpoint
13 → hardware failure
14 → not scheduled up
17 → coming up now (ie, still down, but after expected up time)
3.5 → 3.8 Why host is inaccessible:
0 → destination IMP unreachable
1 → destination host dead
3 → communication with this host is prohibited (naughty!)
4.3 This connection has been pawed over by the logger.
4.4 This connection has been pawed over for flushing by the half-closed
connection flusher.
4.5 CLS received on this connection
4.6 CLS sent on this connection
4.7 RFC received on this connection
4.8 RFC sent on this connection
4.9 Connection state has changed
IMP I/O status word:
1.1 → 1.4 Data mode
1.7 BLOK The connection is blocked in either a RFNM or allocation wait.
1.8 TMO A timeout condition occured. The connection has been closed
or the connection attempt aborted.
1.9 RSET A reset condition occured (the remote host told us to purge our
tables). The connection has been closed or the connection attempt
aborted.
2.1 CTROV The remote host sent more messages and/or bits than we allocated
it. The connection has been closed.
2.2 HDEAD A host dead condition occured. The connection has been closed
or the connection attempt aborted.
2.3 ICTRAN An incomplete transmission occured on the last message sent
on this connection. The connection has been closed.
2.6 IODEND Connection is closed and there is no more input data to read.
2.7 IODTER Somebody is dead. See the other error status for what.
2.8 IODERR Almost all IMP errors set this bit. See the other error status
for what is really wrong.
2.9 IOIMPM Attempt to do IMP I/O without connecting first.
4.2 CLSW Close wait. One close has been sent.
4.3 RFCW Wait for RFC; listening or connection requested
4.4 INPW Input wait
4.5 ALLW Allocation wait
4.6 BLOKW Waiting for link to become unblocked
4.7 LNK0W Control link wait
IMP MTAPEs:
FUNCTION=0 CONNECT
1 Status bits are placed here upon return
2 Local socket number. -1 means gensym a receive socket
3 Wait flag. -1 for wait for connection
4 Byte size, or if sending, byte size is stored here
5 Foreign socket number
6 Host number
FUNCTION=1 LISTEN
1 Status bits are placed here
2 Local socket number
3 Wait flag
4 Byte size of connection. Stored here if send socket
5 Foreign socket number returned here
6 Host number returned here
FUNCTION=2 STATUS
1 Status bits are placed here for send side
2 Receive side status bits are placed here
FUNCTION=3 TERMINATE
1 Status bits are placed here
2 Local socket number
3 Wait flag
FUNCTION=4 WAIT
1 Status is returned here
2 Local socket number
FUNCTION=5 GET TABLE ADDRESSES
1 IMPDIE,,IMPDEA NCP up status
2 NMESIN,,NMESOU NCP I/O statistics
3 IMPTDN,,IMPTUP IMP expected down/up time
4 IMPDWY,,FFLNK IMP down reason, # of links
5 LNKTAB,,IMPDDB Host/link #, DDB
6 IMPLS,,IMPFS Local, foreign socket
7 IMPBS,,IMPSTB Byte size, status word
FUNCTION=6 WAKEUP PROCESS (int level only)
FUNCTION=7 GET LISTEN INFO
1 Status bits are placed here
2 Local socket number (required argument)
3 unused
4 Byte size of connection returned here
5 Foreign socket number returned here
6 Host number returned here
FUNCTION=10 SKIP IF INPUT PRESENT
FUNCTION=11 SEND INTERRUPT
1 Status bits returned here
2 Local socket number
FUNCTION=12 BRING NCP UP (requires UPG)
FUNCTION=13 BRING NCP DOWN (requires UPG)
FUNCTION=14 TEST AND CLEAR INTERRUPT BITS
1 Send side. 0 for no int, -1 for int present
2 Receive side. 0 for no int, -1 for int present
FUNCTION=15 SET ALLOCATIONS
1 Function code. 0 normal, 1 system max, 2 min
2 Number of bits of allocation
3 Number of messages of allocation
FUNCTION=16 RETURN ALLOCATIONS
1 Number of bits we have allocated him
2 Number of messages we have allocated him
3 Number of bits he has left
4 Number of messages he has left
5 Number of bits in free storage
6 Number of messages in free storage
7 Number of bits he has allocated us
10 Number of messages he has allocated us
FUNCTION=17 SET TIMEOUTS
1 Word of 6-bit bytes. Gives number of 2-second units
for timeouts on CLS, RFNM, ALL, RFC, or INP;
0 means wait indefinitely.
FUNCTION=20 GET TIMEOUTS
1 Current timeout word will be placed here
FUNCTION=21 GENSYM SOCKET
1 Gensymmed receive socket returned here
FUNCTION=22 SEND RESET (requires UPG)
1 Host number
FUNCTION=23 SET WHY GOING DOWN (requires UPG)
1 Host down word:
RH contains expected time back up in IMP format
LH 3.1 → 3.4 contains host down reason.
FUNCTION=24 UNWEDGE CONNECTION (requires UPG)
1 Connection index
Host number specification:
The new-style host numbers allow addressing of the full host
capacity of the ARPAnet. The new format has been carefully designed
to be transparent to most user programs. In particular, while
new-style host numbers are always returned, both old and new-style
numbers are accepted. Unless a user program makes assumptions based
on the host number being 8. bits (such as fitting in a halfword), no
conversion should be necessary.
New-style host numbers are represented in the IMP MTAPE UUO's
as follows:
1.1 → 1.8 Host number (bits 1.7 → 1.8 of old number)
1.9 unused, must be zero
2.1 → 3.7 IMP number (bits 1.1 → 1.6 of old number)
3.8 → 3.9 unused, must be zero
4.1 → 4.8 destination network, must be zero or 12
(for ARPAnet)
4.9 unused, must be zero
The reason for the reverse order of Host and IMP number is to
allow the neat compatability hack described above to work. Having the
order in the leader won't work, because host numbers can be zero, and
splitting up bytes (as was suggested) to have a single representation
of the host number in old and new format was just too horrible to
contemplate.
Old style host numbers are accepted in IMP MTAPE 0 (connect). All
MTAPEs which have a host number in their block return the NEW style
host number.
Socket assignments:
Sockets are allocated in job-relative clusters of 8 sockets. The
gensym feature of IMPSER returns the first socket of the cluster,
called the base socket. The NCP ensures that all the sockets in the
cluster are completely unused and are available only to the job which
did the gensym.
Sockets 1 → 777 are considered to be public sockets. Any job may
use any of these sockets. Odd sockets 1 → 377 are reserved for
official ARPAnet contact socket assignments, as listed in "Assigned
Numbers" [Postel]. When an RFC arrives on a contact socket, the NCP
will attempt to fire up DSK:RFCnnn.DMP[NET,SYS] (where nnn is the
socket number, with leading zeros) as a phantom. For example, an
incoming new TELNET protocol RFC will attempt to run RFC027. If the
server fails to pick up the connection after a minute (this can happen
if the server doesn't exist, is broken, or the system is down and
phantoms aren't allowed to run), the NCP will refuse the connection.
Note that the server must actually perform the ICP or whatever.
Even sockets from 2 → 776 and odd sockets from 401 → 777 aren't
assigned for anything special and may be used for private programs
which require a public socket; however, using sockets 2 → 376 is
discouraged.
Sockets ≥1000 are private sockets, and are the sockets normally
used by user programs. In the general ICP case, the base socket is
used as the ICP contact socket by using the gensym option of the
connect MTAPE. The socket assigned to the user program is job
relative and is of the form:
1000+10*((JOB-1)+n*(JOBN-1))
where JOBN is the number of jobs in the system, JOB is the user's job
number, and n is the lowest non-negative integer which will generate
an unused cluster.
User messages:
These are messages which are given in response to errors to
user UUO's.
NCP dead, UUO at user nnnnnn
An IMP MTAPE was given which requires the NCP to be running,
but the NCP is currently down.
Illegal socket in terminate, UUO at user nnnnnn
An IMP MTAPE 3 was given but that socket is not open on the
same DDB as the DDB of the channel which the MTAPE was issued on.
NCP already alive, UUO at user nnnnnn
An IMP MTAPE 12 was given and the NCP was already up.
Illegal user socket, UUO at user nnnnnn
An IMP MTAPE 0 or 1 was given with on a private socket outside
that job's working set.
Message length inconsistant with byte size, UUO at user nnnnn
An INPUT UUO processed a message which didn't match the byte
size of the connection.
IMP I/O without Request For Connection, UUO at user nnnnnn
An INPUT or OUTPUT UUO was given without opening a connection
on the channel.
NCP operation messages:
These are messages which relate to the running of the NCP and not
the IMP-Host or Host-Host protocols.
Arpanet down, n connections aborted, IMP CONI=nnnnnn
The IMP Ready line has gone down, or the IMP interface has entered
test mode. The NCP is bringing itself down and flushing all connections.
Arpanet up
The IMP Ready line was down, or the IMP interface was in test
mode, but this condition has been cleared. The NCP is reinitializing.
NCP off, user=ppn, job=job-name(job#)
The NCP was up and the specified job is bringing it down by
issuing an IMP MTAPE 13. IMPDIE is being set to prevent the NCP from
coming up unless an IMP MTAPE 12 is issued.
NCP on, user=ppn, job=job-name(job#)
The NCP was down and the specified job issued an IMP MTAPE 12
to attempt to restart the NCP. Unless the NCP was down because
IMPDIE was holding it down, this attempt will probably fail since the
NCP tries to bring itself up at clock level.
IMP interface timed out
An IMP interface timeout occured. This should never happen.
IMP-Host Protocol messages:
These are messages related to the first-level protocol.
Unknown msg type, data n
A message type was received of an unused or unimplemented type.
Illegal leader format, data n
A message came in with something other than 17 in the format flag.
We don't believe in old-style leaders, which used this byte for the
type code. Probably the IMP somehow thinks we are talking old-style
leaders, and the NCP will need to be cycled. We ignore messages with
4 in this byte (old-style no-ops) since the IMP will send them to us
in case we are an old-style host.
Error in leader, data n
The IMP detected an error in a previous Host-to-IMP message and
had to assume that the leader was garbled. The data byte is the
sub-type of the message.
IMP going down in nnn mins for mmm mins
The IMP is transmitting this message as a warning that it will
be going down. The following cells are loaded with information about
the forthcoming downtime:
IMPDWY 0 → last warning or panic, down in 30 seconds
1 → scheduled hardware PM
2 → scheduled software reload
3 → emergency restart
IMPTDN Time IMP will go down, in jiffies
IMPTUP Time IMP will come up, in jiffies
Error in data
The IMP's Error flip-flop was set after transmission of the
leader of a message but before the end of the message.
IMP ready line dropped
The IMP sent us an interface reset message.
RFNM with no links, host hhh/iii, link nnn
The IMP sent us a RFNM, but there are no links active.
Spurious RFNM, host hhh/iii, link nnn
A RFNM was received on a link that we don't believe in.
Unknown link, host hhh/iii, link nnn
A regular message came in on a link that we don't believe in.
Host-host Protocol messages:
These are messages related to the second-level protocol.
No DDB, host hhh/iii, link nnn
An incomplete transmission or regular message occured on a known
and non-zero link, but there is no DDB to specify where the error or
the data is to go to.
Input with no receive side, host hhh/iii, link nnn
A regular message occured on a known non-zero link, but there
is no receive side on the DDB for that link (ie, only a send socket
is opened).
Input with connection not entirely open, host hhh/iii, link nnn
A regular message occured on a known non-zero link, but the
receive side on the DDB hasn't been completely open yet (ie, the
matching RFC hasn't been sent yet).
Unknown link in ctl msg, host hhh/iii, link 0, data ddd
An unknown link was referenced in a host-host control message.
The data is the losing host-link number.
Short msg, host hhh/iii, link 0, data dd
A host-host control message was shorter than required by the
protocol (ie, was missing a required argument). The data is the
opcode of the losing message.
New ctl msg, host hhh/iii, link 0, data dd
An unknown (probably new type which we don't know about yet)
type host-host control message was received. The data is the
losing opcode.
Illegal bs in ctl msg, host hhh/iii, link 0, data dd
An illegal byte size was specified in a host-host control
message. The data is the losing byte size.
Illegal gender in RFC, host hhh/iii, link 0
The host is trying to engage us in homosocketuality. Since this
is against the laws of God and ARPA, we naturally refuse to consent
to it.
Incomplete connection, host hhh/iii, link 0
A host-host control message was received which referenced a
a connection, but a connection of the desired gender doesn't exist.
For example, ALL with only a receive side, INS with only a send
side, etc.
RFC received but no links available, host hhh/iii, link 0
An RFC was received, but all the available slots in the system
IMP tables are taken.
CLS on non-ex skt, host hhh/iii, link 0, data ddd
A CLS was received on a socket we don't believe in.
type ERR from host hhh/iii, data ddd ddd...
An ERR has been received from the foreign host. The data is the
contents of the losing message. The type is one of the following:
Undef This error message is peculiar to the foreign
host. The first byte of the data contains the
foreign host's own sub-type.
Ill op We sent the foreign host a control message
it doesn't know about.
Sh ctl msg We sent the foreign host a message with an
insufficient number of data bytes.
Bad param We sent the foreign host a message with
invalid arguments.
Non-ex skt We sent the foreign host a message which
referenced a socket which doesn't exist.
Non-opn skt We sent the foreign host a message which
referenced a socket which isn't completely
open yet.
Non-ex lnk We sent the foreign host a message on a link
which it doesn't believe in.
Bad hst hdr We sent the foreign host a message with an
invalid host header (bad M1/M2, byte size,
length, etc.).
Unknown Some unknown error type.